package br.com.marcelo.reservasis.client.pagina.apartamento;

import br.com.aroeirasoftware.gwtcomponents.client.components.ASComboBox;
import br.com.aroeirasoftware.gwtcomponents.client.components.ASFieldSize;
import br.com.aroeirasoftware.gwtcomponents.client.components.ASMessagePanel;
import br.com.aroeirasoftware.gwtcomponents.client.components.ASMessagePanel.ASMessageSeverity;
import br.com.aroeirasoftware.gwtcomponents.client.components.ASOperation;
import br.com.aroeirasoftware.gwtcomponents.client.components.ASPageSearch;
import br.com.aroeirasoftware.gwtcomponents.client.components.ASTableColumn;
import br.com.aroeirasoftware.gwtcomponents.client.query.ASQuery;
import br.com.aroeirasoftware.gwtcomponents.client.query.ASQueryObject;
import br.com.aroeirasoftware.gwtcomponents.client.query.ASQueryResult;
import br.com.marcelo.reservasis.client.componentes.ReservaSISApplication;
import br.com.marcelo.reservasis.client.componentes.ReservaSISResources;
import br.com.marcelo.reservasis.client.i18n.ReservaSISI18N;
import br.com.marcelo.reservasis.client.services.apartamento.ApartamentoUIService;
import br.com.marcelo.reservasis.client.util.ComboBoxUtil;
import br.com.marcelo.reservasis.domain.model.Apartamento;
import br.com.marcelo.reservasis.domain.model.TipoApartamento;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.rpc.AsyncCallback;
import java.lang.String;
import java.util.Map;

/**
 *
 * @author Marcelo Rodrigues
 */
public class ApartamentoPesquisarPagina extends ASPageSearch<Apartamento> {

    private ASQuery consulta;

    public ApartamentoPesquisarPagina() {
        super(null, ReservaSISApplication.getInstance(),
                ReservaSISI18N.messages.apartamento(),
                ReservaSISResources.APARTAMENTO(),
                new ASTableColumn[]{new ASTableColumn(0, ReservaSISI18N.messages.numeroApartamento(), "texto-centro", "texto-centro", "85%"),
                    new ASTableColumn(1, ReservaSISI18N.messages.descricaoApartamento(), "texto-centro", "texto-esquerda", "85%"),
                    new ASTableColumn(2, ReservaSISI18N.messages.numeroQuarto(), "texto-centro", "texto-centro", "85%")},
                new ASOperation[]{ASOperation.CRIACAO, ASOperation.ALTERACAO, ASOperation.EXCLUSAO, ASOperation.LEITURA});
    }

    @Override
    public void pesquisar(Map<String, Object> parametros) {
        ASQueryObject qo = new ASQueryObject(Apartamento.class, "ap");
        qo.addSelect(ASQueryObject.Expressions.as("ap.idapart", "idapart")).
                addSelect(ASQueryObject.Expressions.as("ap.numApart", "numApart")).
                addSelect(ASQueryObject.Expressions.as("ap.numQuartosApart", "numQuartosApart")).
                addSelect(ASQueryObject.Expressions.as("ap.tipoApartamento", "tipoApartamento")).
                addSelect(ASQueryObject.Expressions.as("ap.descricaoApart", "descricaoApart"));

        qo.addWhere(ASQueryObject.Expressions.likeFull("ap.descricaoApart", parametros.get("descricao")));
        qo.addWhere(ASQueryObject.Expressions.eq("ap.numApart", parametros.get("numeroApartamento")));
        qo.addWhere(ASQueryObject.Expressions.eq("ap.numQuartosApart", parametros.get("numeroQuarto")));
        qo.addWhere(ASQueryObject.Expressions.eq("ap.tipoApartamento", parametros.get("tipoApartamento")));

        consulta = qo.getConsulta(ASQueryObject.Expressions.count("ap.idapart", "idapart"), true, 5);

        paginar(1);

    }

    @Override
    public void renderizarLinhaTabela(Apartamento t) {
        addCelulaTabela(ReservaSISI18N.messages.numeroApartamento(), t.getNumApart().toString());
        addCelulaTabela(ReservaSISI18N.messages.descricaoApartamento(), t.getDescricaoApart());
        addCelulaTabela(ReservaSISI18N.messages.numeroQuarto(), t.getNumQuartosApart().toString());
    }

    @Override
    public void paginar(int pagina) {
        consulta.setPagina(pagina);

        ApartamentoUIService.Async.getInstance().getPorConsulta(consulta, new AsyncCallback<ASQueryResult<Apartamento>>() {

            public void onFailure(Throwable caught) {
                ASMessagePanel.getInstance().exibirMensagem(
                        ReservaSISI18N.messages.msgErro(ReservaSISI18N.messages.gPesquisar(), caught),
                        ASMessagePanel.ASMessageSeverity.ERRO,
                        ASMessagePanel.ASMessageOption.OK, new Command() {

                    public void execute() {
                        liberarPesquisa();
                    }
                });
            }

            public void onSuccess(ASQueryResult<Apartamento> result) {
                setResultadoPesquisa(result.getPagina(), result.getPaginas(), result.getLista());
            }
        });
    }

    @Override
    public void executar(Apartamento t, String nomeOperacao) {
        if (nomeOperacao.equals(OPERACAO_CADASTRAR)) {
            new ApartamentoCriarAlterarPagina(this, ReservaSISApplication.getInstance(),
                    ReservaSISI18N.messages.tituloApartamentoCriarPagina(), ReservaSISI18N.messages.subtituloApartamentoCriarPagina("Asterisco")).abrir();
        } else if (nomeOperacao.equals(OPERACAO_DETALHAR)) {
            new ApartamentoDetalharPagina(t).abrir();
        } else if (nomeOperacao.equals(OPERACAO_ALTERAR)) {
            new ApartamentoCriarAlterarPagina(this, ReservaSISApplication.getInstance(), ReservaSISI18N.messages.tituloApartamentoAlterarPagina(),
                    ReservaSISI18N.messages.subtituloApartamentoAlterarPagina("Asterisco"), t).abrir();
        } else if (nomeOperacao.equals(OPERACAO_EXCLUIR)) {
            ApartamentoUIService.Async.getInstance().excluir(t, new AsyncCallback<Void>() {

                @Override
                public void onFailure(Throwable caught) {
                    ASMessagePanel.getInstance().exibirMensagem(
                            ReservaSISI18N.messages.msgErro(ReservaSISI18N.messages.gExcluir(), caught),
                            ASMessagePanel.ASMessageSeverity.ERRO,
                            ASMessagePanel.ASMessageOption.OK, new Command() {

                        public void execute() {
                            liberarPesquisa();
                        }
                    });
                }

                @Override
                public void onSuccess(Void result) {
                    ASMessagePanel.getInstance().exibirMensagem(
                            ReservaSISI18N.messages.msgSucesso(
                            ReservaSISI18N.messages.apartamento(),
                            "",
                            ReservaSISI18N.messages.gExcluido()),
                            ASMessageSeverity.SUCESSO, ASMessagePanel.ASMessageOption.OK);
                }
            });

        }
    }

    @Override
    public void configurarComponentes() {
        addCampoTexto("descricao", ReservaSISI18N.messages.descricaoApartamento(), false, ASFieldSize.GRANDE);
        addCampoTexto("numeroApartamento", ReservaSISI18N.messages.numeroApartamento(), false, ASFieldSize.MEDIO);
        addCampoTexto("numeroQuarto", ReservaSISI18N.messages.numeroQuarto(), false, ASFieldSize.MEDIO);
        addCampoOpcoesComboBox("tipoApartamento", ReservaSISI18N.messages.tipoApartamento(), false, true);

        carregarComboBox();
    }

    public void carregarComboBox() {
        ComboBoxUtil.preencherComboBoxTipoApartamento((ASComboBox<TipoApartamento>) getCampo("tipoApartamento").getComponente());
    }

    @Override
    public void limpar() {
        super.limpar();
        ((ASComboBox<TipoApartamento>) getCampo("tipoApartamento").getComponente()).clear();
        ((ASComboBox<TipoApartamento>) getCampo("tipoApartamento").getComponente()).addObjeto(null, "...");
        ComboBoxUtil.preencherComboBoxTipoApartamento((ASComboBox<TipoApartamento>) getCampo("tipoApartamento").getComponente());
    }
}
